home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cpp_libs / answrbok / 5_2.lha / 5_2 / 5_2b4.c < prev    next >
Text File  |  1993-08-08  |  1KB  |  67 lines

  1. * Copyright (c) 1990 by AT&T Bell Telephone Laboratories, Incorporated. */
  2. * The C++ Answer Book */
  3. * Tony Hansen */
  4. * All rights reserved. */
  5. / walk down the tree, invoking the named function for
  6. / each node in the ordered fashion designated
  7. include <tree.h>
  8.  
  9. tatic void doorderedwalk(tnode *head, walkfn fn,
  10.    int rev, int depth,
  11.    int beginning, int middle, int end)
  12.  
  13.    if (!head)
  14. return;
  15.  
  16.    // normally go left to right
  17.    tnode *node1 = head->left;
  18.    tnode *node2 = head->right;
  19.  
  20.    if (rev)
  21. { // go right to left
  22. node1 = head->right;
  23. node2 = head->left;
  24. }
  25.  
  26.    if (beginning)
  27.        (*fn)(head, depth);
  28.  
  29.    doorderedwalk(node1, fn, rev, depth+1,
  30.        beginning, middle, end);
  31.  
  32.    if (middle)
  33. (*fn)(head, depth);
  34.  
  35.    doorderedwalk(node2, fn, rev, depth+1,
  36.        beginning, middle, end);
  37.  
  38.    if (end)
  39. (*fn)(head, depth);
  40.  
  41.  
  42. / invoke the walking function in various fashions
  43. oid tree:: preorderwalk(walkfn fn, int rev)
  44.  
  45.    doorderedwalk(head, fn, rev, 0, 1, 0, 0);
  46.  
  47.  
  48. oid tree:: inorderwalk(walkfn fn, int rev)
  49.  
  50.    doorderedwalk(head, fn, rev, 0, 0, 1, 0);
  51.  
  52.  
  53. oid tree:: postorderwalk(walkfn fn, int rev)
  54.  
  55.    doorderedwalk(head, fn, rev, 0, 0, 0, 1);
  56.  
  57.  
  58. oid tree:: doubleorderwalk(walkfn fn, int rev)
  59.  
  60.    doorderedwalk(head, fn, rev, 0, 1, 1, 0);
  61.  
  62.  
  63. oid tree:: tripleorderwalk(walkfn fn, int rev)
  64.  
  65.    doorderedwalk(head, fn, rev, 0, 1, 1, 1);
  66.  
  67.